#include <stdio.h>
#include "sequence_list.h"
void InitList(SeqList *L)
{
    // 初始化顺序表的结构成员length的值为0，也就是空表
    L->length = 0;
}
bool ListEmpty(SeqList L)
{
    return L.length == 0;
}
int ListLength(SeqList L)
{
    // 直接返回顺序表的length成员的值
    return L.length;
}
bool GetElem_SequenceList(SeqList L, int pos, int *elem)
{
    // 判断位置是否合法
    if (pos < 1 || pos > L.length)
    {
        return false;
    }
    // 使用elem获取pos-1位的元素并返回
    *elem = L.data[pos - 1];
    return true;
}
int LocalElem(SeqList L, int elem)
{
    // 使用for循环的方式找elem元素的位置
    for (int i = 0; i < L.length; i++)
    {
        if (elem == L.data[i])
        {
            return i + 1;
        }
    }
    return 0;
}
bool ListInsert(SeqList *L, int pos, int elem)
{
    // 判断插入位置是否合法，以及是否有空闲空间
    if (pos < 1 || pos > L->length + 1)

    {
        return false;
    }
    // 如果L->length的值大于等于maxsize，说明顺序表已满
    if (L->length >= MAXSIZE)
    {
        return false;
    }
    // 将插入位置之后的元素向后移动一位
    // 需要使用循环从pos-1位开始往前移动
    // 由于是从1开始编号的，所以循环条件是i>=pos-1

    for (int i = L->length - 1; i >= pos - 1; i--)
    {
        // 将后面的元素依次后移
        L->data[i + 1] = L->data[i];
    }
    L->data[pos - 1] = elem;
    L->length++;
    return true;
}
bool ListDelete(SeqList *L, int pos, int *elem)
{
    // 判断删除位置是否合法
    if (pos < 1 || pos > L->length)
    {
        return false;
    }
    // 使用指针变量获取删除的元素
    *elem = L->data[pos - 1];
    // 将后面的元素往前移动，使用for循环的方式实现删除
    for (int i = pos; i < L->length; i++)
    {
        L->data[i - 1] = L->data[i];
    }
    // 删除成功后，长度减一
    L->length--;
    return true;
}
void PrintList(SeqList L)
{
    printf("顺序表的长度为：%d\n", L.length);
    // 依次打印顺序表中的元素
    for (int i = 0; i < L.length; i++)
    {
        printf("%d ", L.data[i]);
    }
    printf("\n");
}
void ClearList(SeqList *L)
{
    // 清空顺序表，实际上是将length成员的值为0
    // 一旦使用length++，就会改变表的长度
    // 所以需要使用指针变量来改变指针所指的值。
    L->length = 0;
}